/**
 * 对话框控件
 */
var Dialog = cc.Class({
    extends: cc.Component,

    properties: {
        buttonTemplate:{
            default: null,
            type:cc.Node,
            tooltip:'用作按钮的模板，通常就佩戴在对话框自身，以非活动形态存在。',
        },
        top:{
            default: null,
            type:cc.Node,
            tooltip:'对话框标题组件',
        },
        content:{
            default:null,
            type:cc.Node,
            tooltip:'对话框内容组件'
        },
        bottom:{
            default:null,
            type:cc.Node,
            tooltip:'对话框按钮容器'
        }
    },

    // LIFE-CYCLE CALLBACKS:

    onLoad () {
        this.uiManager = require('geoUIManager').Singleton;
    },
    /**
     * 为对话框增添一个button
     * @param {string} text 按钮上的文字，留null，则保持按钮原型的文字
     * @param {function} onClick 按钮点击时的回调，形式如下：
     * function onClick(dialog, button)，dialog是对话框组件的引用，button是被点击按钮的引用
     * @param {cc.Node} buttonNode 若要自己提供button，请设置于此
     * @param {cc.Label} buttonLabel 自己设置的button的label组件，若留空，则自动寻找一个label
     */
    addButton(text, onClick, buttonNode, buttonLabel){
        return this._addButton(text, onClick, buttonNode, buttonLabel, false);
    },
    /**
     * 添加关闭按钮，与addButton用法相同，但会自动调用关闭对话框的功能
     * @param {string} text 按钮上的文字，留null，则保持按钮原型的文字
     * @param {function} onClick 按钮点击时的回调，形式如下：
     * function onClick(dialog, button)，dialog是对话框组件的引用，button是被点击按钮的引用
     * @param {cc.Node} buttonNode 若要自己提供button，请设置于此
     * @param {cc.Label} buttonLabel 自己设置的button的label组件，若留空，则自动寻找一个label
     */
    addCloseButton(text, onClick, buttonNode, buttonLabel){
        return this._addButton(text, onClick, buttonNode, buttonLabel, true);
    },
    /**
     * 设置标题
     * @param {string} text 
     */
    setTitle(text) {
        var label = this.top.getComponentInChildren(cc.Label);
        label && (label.string = text);
        return this;
    },
    /**
     * 设置显示内容
     * @param {*} text 
     */
    setMessage(text){
        var label = this.content.getComponentInChildren(cc.Label);
        label && (label.string = text);
        return this;
    },
    /**
     * 设置内容区域尺寸
     * @param {int} width 
     * @param {int} height 
     */
    setContentSize(width, height){
        this.node.width = width;
        this.node.height = height + this.top.height + this.bottom.height;
        //
        this._widget = this._widget || this.getComponent(cc.Widget);
        this._widget.updateAlignment();
        //
        return this;
    },
    /**
     * 设置新的内容节点，将移除的内容节点下的内容
     * @param {cc.Node} content 
     */
    setContent(content){
        this.content.destroyAllChildren();
        content.parent = this.content;
        //
        var w = content.getComponent(cc.Widget);
        w && (w.updateAlignment());
        // 
        return this;
    },
    _addButton(text, onClick, buttonNode, buttonLabel, closeDialog){
        // 准备按钮
        buttonNode = buttonNode || cc.instantiate(this.buttonTemplate);
        buttonLabel = buttonLabel || buttonNode.getComponentInChildren(cc.Label);
        // 设置按钮
        buttonLabel.string = text;
        // 添加到Dialog
        buttonNode.parent = this.bottom;
        // 添加事件响应
        if (onClick !== null || closeDialog === true) {
            buttonNode.on('click', this._internalOnClick.bind(this, this, buttonNode, closeDialog, onClick));
        }
        //
        buttonNode.active = true;
        //
        return this;
    },
    _internalOnClick(dialog, button, closeDialog, externalOnClick) {
        //
        if (externalOnClick)
            externalOnClick(dialog, button);
        //
        if (closeDialog === true) {
            // 关闭对话框
            this.uiManager.close(dialog);
        }
    },
});

module.exports = Dialog;
